
#pragma once
#ifndef _CREATE_WIN_H_
#define _CREATE_WIN_H_

#include <SDC/system.h>
#include "system_CWT.h"

class CreateWin {
private:
    void init(int begin_x, int begin_y);

protected:
    int _x, _y;
    WINDOW *_win;

    int _choice;
    int _highlight;
    int _highlightX;
    int _highlightY;

    void delWin() {
        wclear(_win);
        wrefresh(_win); 
        delwin(_win); 
    }
    
    int ifButtonWsOrAdPlus(vector_int &button, int highlight, int size);
    int ifButtonWsOrAdMin(vector_int &button, int highlight, int size);

public:
    CreateWin(int x, int y, 
            int begin_x = 0, int begin_y = 0, 
            bool init = true);

    WINDOW *getWin() { return _win; }
    int getX() { return _x; }
    int getY() { return _y; }
    int getChoice() { return _choice; }
    int getHighlight() { return _highlight; }
    void setHighlight(int highlight) { _highlight = highlight; }
    int getHighlight_x() { return _highlightX; }
    int getHighlight_y() { return _highlightY; }

    /**
     * @brief Проверяет кнопку на нажатие
     * 
     * @return int 
     */
    int getCh() { return _choice = wgetch(_win); }
    /**
     * @brief Обновление окна
     * 
     */
    void refresh() { wrefresh(_win); }
    /**
     * @brief Включение отображение цветовых символов
     * 
     * @param color - цвет
     */
    void w_attron(const int color) { wattron(_win, color); }
    /**
     * @brief Отключение отображение цветовых символов
     * 
     * @param color - цвет
     */
    void w_attroff(const int color) { wattroff(_win, color); }
    void printStr(const int x, const int y, const string text) { 
        mvwprintw(_win, y, x, "%s", text.c_str()); 
    }
    void scanStr(const int x, const int y, char text[]) { 
        mvwscanw(_win, y, x, "%s", text); 
    }

    /**
     * @brief Управление клавишами вверх и вниз или вправо и влево
     * 
     * @param size - размер vector или array
     * @param WS_or_AD - true - WS, false - AD
     */
    void wsOrAdButton(const int size, const bool WS_or_AD = true);
    /**
     * @brief Управление клавишами вверх, вниз, вправо и влево
     * 
     * @param size_x - размер vector или array по X
     * @param size_y - размер vector или array по Y
     */
    void wasdButton(const int size_x, const int size_y);

    void clearWin(const int start_x, const int start_y, const int finish_x,
                    const int finish_y);
    /**
     * @brief Рисование стенки по вертикальной и горизонтальной оси
     * 
     * @param wall_x 
     * @param wall_y 
     * @param drawWallXOrY - true - рисовать по X, false - по Y
     */
    void drawWall(int wall_x, int wall_y, 
        const bool drawWallXOrY = true); 

    /**
     * @brief Выделение текста для меню
     * 
     * @param size - размер vector или array с словами меню
     * @param x - координата X текста
     * @param y - координата Y текста
     * @param text - vector слов
     */
    void textSelection(const vector_str vec, const int x, const int y);
    void textSelection(const vector_str vec, function<void(int, vector_str)> func);
    
    template<typename T> void textSelectionTable(const vector<vector<T>> tableVec,
            function<void(int, int)> func) {
    
        FOR_SIZE_T(i, tableVec.size()) {
            FOR_SIZE_T(j, tableVec[i].size()) {
                if (NUMBER(j) == _highlightX && NUMBER(i) == _highlightY) {
                    w_attron(A_REVERSE);
                }

                if (i == 0 || j == 0) { func(i, j);
                } else { func(i, j); }

                w_attroff(A_REVERSE);
            }
        }

    }

    virtual ~CreateWin() { delWin(); }
};

class CreateSubwin : public CreateWin {
private:
    void init(WINDOW *main_win, int begin_x, int begin_y);

public:
    /**
     * @brief Создание под окно
     * 
     * @param win - Родительское окно
     * @param x - Координата X для создаваемого под окна
     * @param y - Координата Y для создаваемого под окна
     * @param begin_x - Координата X для местоположения под окна в родительском окне
     * @param begin_y - Координата Y для местоположения под окна в родительском окне
     */
    CreateSubwin(WINDOW *win, int x, int y, int begin_x = 0, int begin_y = 0)
        : CreateWin(x, y, 0, 0, false) {

        init(win, begin_x, begin_y);
    }

    ~CreateSubwin() override {}
};

#endif
